vkashti / app / admin / quiz / [id] / page.tsx
page.tsx
Raw
'use client';
import { useEffect, useState } from 'react';
import { createClient } from '@/utils/supabase/client';
import { QuizProvider } from '../QuizProvider';
import { QuizHeader } from '../components/QuizHeader';
import { QuizContent } from '../components/QuizContent';
import { useRouter } from 'next/navigation';

// Define Quiz type for better type safety
export type Quiz = {
  id: number;
  name: string | null;
  date: string | null;
  url: string | null;
  created_at: string;
}

export default function QuizDetail({ params }: { params: { id: string } }) {
  const quizId = parseInt(params.id);
  const [selectedQuiz, setSelectedQuiz] = useState<Quiz | null>(null);
  const supabase = createClient();
  const router = useRouter();

  useEffect(() => {
    const fetchQuiz = async () => {
      const { data, error } = await supabase
        .from('quizes')
        .select('*')
        .eq('id', quizId)
        .single();

      if (error) {
        console.error('Error fetching quiz:', error);
        router.push('/admin/quiz'); // Redirect to quiz list on error
        return;
      }

      // Ensure the data has all required fields
      const quiz: Quiz = {
        id: data.id,
        name: data.name,
        date: data.date,
        url: (data as any).url || null,
        created_at: data.created_at
      };

      setSelectedQuiz(quiz);
    };

    fetchQuiz();
  }, [quizId, router, supabase]);

  const handleQuizUpdate = (updatedQuiz: Partial<Quiz>) => {
    if (selectedQuiz) {
      setSelectedQuiz({ ...selectedQuiz, ...updatedQuiz });
    }
  };

  const handleBack = () => {
    router.push('/admin/quiz');
  };

  if (!selectedQuiz) {
    return <div className="p-6">Loading...</div>;
  }

  return (
    <QuizProvider quizId={quizId}>
      <QuizHeader 
        quiz={selectedQuiz} 
        onBack={handleBack}
        onQuizUpdate={handleQuizUpdate}
      />
      <div className="p-6"></div>
      <QuizContent quiz={selectedQuiz} />
    </QuizProvider>
  );
}